package zy.blue7.common.enums;

import lombok.NonNull;

import java.io.Serializable;

/**
 * 自定义枚举父级接口
 *
 * @param <C>
 * @param <V>
 */
public interface IEnum<C extends Serializable, V extends Serializable> {

    /**
     * 获取枚举的code
     *
     * @return code
     */

    C getCode();

    /**
     * 获取枚举的value
     *
     * @return value
     */
    // @JsonValue 放在 接口中也行，放在方法上也行，放在枚举字段属性上也行，都可以实现枚举到对象属性映射效果
//    @JsonValue
    V getValue();

    /**
     * 根据code从指定枚举类中获取枚举值
     *
     * @param clazz 枚举类
     * @param code  code
     * @param <E>   枚举的类型
     * @return 枚举值
     */
    @NonNull
    static <E extends Enum<?> & IEnum, C> E formCode(@NonNull Class<E> clazz, @NonNull C code) {
        E[] elements = clazz.getEnumConstants();
        for (E element : elements) {
            if (element.getCode().equals(code)) {
                return element;
            }
        }
        throw new IllegalArgumentException("不合法的枚举code");
    }

}